/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fait.ferm.persists;

import fait.ferm.global.Glob;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Суперкласс для всех сущностей БД.
 * Классы, расширяющие этот класс, должны реализовать все абстрактные методы, 
 * а также метод <code>toString()</code>.
 * Все классы, расширяющие данный, должны называться в точности также, как имя таблицы, но первая буква - заглавная.
 * @author alex
 */
public abstract class PersistsObject {
	/**
	 * Уникальный идентификатор объекта. Каждая таблица БД должна содержать такое поле.
	 */
	protected int id;
	/**
	 * Соединение с БД
	 */
	protected Connection con;
	/**
	 * Имя таблицы сущности.
	 */
	protected String table;
	/**
	 * 
	 * @return Возвращает соединение с БД
	 */
	public Connection getConnecton(){return con;}
     /**
	 * Возвращает id объекта. В отличие от других полей, id изменять нельзя.
	 * Если нужно изменять id, создайте новый объект с новым id.
	 * @return Возвращает id объекта.
	 */
	public int getId(){return id;}
	/**
	 * Конструктор. Создает пустой объект, не хранящийся в БД 
	 * @param pcon Соединение с БД
	 */
	public PersistsObject(){
		id=-1;
		con=Glob.getConnection();
	}
	/**
	 * Создает объект по указанному id
	 * @param pcon Соединение с БД
	 * @param pid id объекта
	 */
	public PersistsObject(int pid){
		id=pid;
		con=Glob.getConnection();
	}
	
	public void setId(Integer pId){
		id = pId;
		try {
			load();
		} catch (Exception ex) {
			Logger.getLogger(PersistsObject.class.getName()).log(Level.SEVERE, null, ex);
		}
	}
	/**
	 * Метод загружает параметры объекта из БД, если id > 0
	 * @throws Exception
	 */
	abstract public void load() throws Exception;
	/**
	 * Сохраняет объект в БД. Если объект уже есть в БД, вызвается {@link fait.ferm.persists.PersistsObject#update() update()}.
	 * Иначе вызывается {@link fait.ferm.persists.PersistsObject#createNew() createNew()} 
	 * @throws SQLException
	 */
	public void save() throws SQLException,Exception {
		if(id==-1) {
			createNew();
		}
		else {
			update();
		}
	}
	/**
	 * Выполняется сохранение параметров объекта в БД. Объект должен уже в БД существовать.
	 * @throws SQLException
	 */
	abstract protected void update() throws SQLException;
	/**
	 * Выполняется создание нового объекта в БД. При этом формируется новый <code>id</code>
	 * @throws SQLException
	 */
	abstract protected void createNew() throws SQLException,Exception;

	
}
